package com.masq.aboard.common.results;

import com.masq.aboard.common.enums.ResultCode;

/**
 * 通用返回包装
 * @author masq
 * @since 2024-05-02
 */
public class CommonResult<T> {

    private Integer code;

    private String message;

    private T data;

    private CommonResult(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 生成表示操作成功的CommonResult对象。
     *
     * @param data 成功时返回的数据。
     * @param <T> 返回数据的类型。
     * @return 返回一个包含成功代码、成功消息和数据的CommonResult对象。
     */
    public static <T> CommonResult<T> success(T data) {
        // 创建并返回一个包含成功状态码、成功消息和用户数据的CommonResult对象
        return new CommonResult<>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
    }

    /**
     * 生成一个表示操作成功的CommonResult对象。
     *
     * @return CommonResult<T> - 包含成功状态码和成功消息的CommonResult对象。返回的对象中，数据部分（T）为null。
     */
    public static <T> CommonResult<T> success() {
        // 创建并返回一个包含成功状态码和成功消息的CommonResult对象
        return new CommonResult<>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), null);
    }

    /**
     * 生成一个表示操作失败的CommonResult对象。
     *
     * @return 返回一个填充了失败状态码和消息的CommonResult对象。返回对象的data字段为null。
     */
    public static <T> CommonResult<T> failed() {
        // 创建并返回一个包含失败状态码和失败消息的CommonResult对象
        return new CommonResult<>(ResultCode.UNKNOWN_ERROR.getCode(), ResultCode.UNKNOWN_ERROR.getMessage(), null);
    }

    /**
     * 生成一个表示操作失败的CommonResult对象。
     *
     * @param resultCode 操作结果的状态码，包含具体的错误代码和错误信息。
     * @param <T> 泛型参数，表示返回结果的类型。
     * @return 返回一个CommonResult对象，其中包含失败的状态码和消息，数据部分为空。
     */
    public static <T> CommonResult<T> failed(ResultCode resultCode) {
        // 创建并返回一个包含失败状态码和失败消息的CommonResult对象
        return new CommonResult<>(resultCode.getCode(), resultCode.getMessage(), null);
    }

    /**
     * 生成一个表示操作失败的CommonResult对象。
     *
     * @param code 状态码，用于表示操作的失败原因。
     * @param message 失败的详细信息，便于前端展示错误信息。
     * @param <T> 泛型参数，表示返回结果的类型。
     * @return 返回一个包含失败状态码和失败消息的CommonResult对象。
     */
    public static <T> CommonResult<T> failed(Integer code, String message) {
        // 创建并返回一个包含失败状态码和失败消息的CommonResult对象
        return new CommonResult<>(code, message, null);
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}
